/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package net.etrs.formathlon.entity.utilisateur;

import java.util.ArrayList;
import java.util.List;
import javax.persistence.CascadeType;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.EnumType;
import javax.persistence.Enumerated;
import javax.persistence.FetchType;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.NamedQueries;
import javax.persistence.NamedQuery;
import javax.persistence.OneToOne;
import net.etrs.formathlon.metier.utils.constantes.RoleSpring;
import net.etrs.formathlon.entity.utils.ComparableEvenThoughUnpersisted;
import net.etrs.formathlon.persistance.utils.JpaRequestNames;

/**
 * entity representant la personne qui va utiliser l'application.
 * Le minimum d'information va etre stocké en base. Le reste sera stocké
 * le context de securité dans la varial.
 * @author OPIF
 */
@NamedQueries({
    @NamedQuery(name = JpaRequestNames.LISTE_SUBORDONNES,
    query = "select object(u) from Utilisateur u where u.archive = false and u.entite like :entite "
    + "and u.personnel is not null"),
    //Déclaration d’une à une requête nommée
    @NamedQuery(name = JpaRequestNames.GET_UTILISATEUR_BY_LOGIN,
    query = "select object(u) from Utilisateur u where u.login=:logintest"),
    @NamedQuery(name = JpaRequestNames.LISTE_PERSONNEL,
    query = "select object(u) from Utilisateur u where u.archive = false "
    + "and u.personnel is not null"),
    @NamedQuery(name = JpaRequestNames.LISTE_DISTINCT_ENTITE,
    query = "select distinct(u.entite) from Utilisateur u where u.archive = false "
    + "and u.personnel is not null"),
    @NamedQuery(name = JpaRequestNames.LISTE_DISTINCT_ENTITE_DIVISION,
    query = "select distinct(u.entite) from Utilisateur u where u.archive = false "
    + "and u.personnel is not null and u.entite like :entite")
})
@Entity
public class Utilisateur extends ComparableEvenThoughUnpersisted<Utilisateur> {

    private static final long serialVersionUID = 1L;
    
    /**
     * Identifiant.
     */
    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    private Long id;
    /**
     * Liste des droits associté à l'utilisateur.
     */
    @Enumerated(EnumType.STRING)
    private List<RoleSpring> listRoleSpring = new ArrayList<RoleSpring>();
    /**
     * Adresse mail.
     */
    private String mail = "";
    /*
     * nom de conexion de l'utilisateur à Active directory.
     */
    @Column(unique = true, nullable = false)
    private String login = "";
    /**
     * Personnel associé à l'utilisateur.
     */
    @OneToOne(cascade = CascadeType.ALL, fetch = FetchType.LAZY)
    private Personnel personnel = new Personnel();
    /**
     * Donnée technique qui va ne plus faire s'afficher les utilisateur archivé.
     */
    private boolean archive = false;
    /**
     * Bureax de l'utilisateur récuperé du LDAP qui va personne de définir sur quoi
     * aura vu l'utilisateur.
     */
    private String entite = "";

    // Constructeurs
    /**
     * Constructeur par defaut.
     */
    public Utilisateur() {
    }

    /**
     * Constructeur qui initialise les variables.
     * @param listRoleSpring
     * @param mail
     * @param login
     * @param personnel
     * @param entite 
     */
    public Utilisateur(List<RoleSpring> listRoleSpring, String mail, String login, Personnel personnel, String entite) {
        this.listRoleSpring = listRoleSpring;
        this.mail = mail;
        this.login = login;
        this.personnel = personnel;
        this.entite = entite;
    }

    // Getter et setter
    /**
     * getter.
     * @return entite
     */
    public String getEntite() {
        return entite;
    }

    /**
     * setter.
     * @param entite 
     */
    public void setEntite(String entite) {
        this.entite = entite;
    }

    /**
     * getter.
     * @return personnel 
     */
    public Personnel getPersonnel() {
        return personnel;
    }

    /**
     * setter.
     * @param personnel
     */
    public void setPersonnel(Personnel personnel) {
        this.personnel = personnel;
    }

    /**
     * getter.
     * @return listRoleSpring
     */
    public List<RoleSpring> getListRoleSpring() {
        return listRoleSpring;
    }

    /**
     * setter.
     * @param listRoleSpring 
     */
    public void setListRoleSpring(List<RoleSpring> listRoleSpring) {
        this.listRoleSpring = listRoleSpring;
    }

    /**
     * getter.
     * @return login
     */
    public String getLogin() {
        return login;
    }

    /**
     * setter.
     * @param login 
     */
    public void setLogin(String login) {
        this.login = login;
    }

    /**
     * getter.
     * @return mail 
     */
    public String getMail() {
        return mail;
    }

    /**
     * setter.
     * @param mail 
     */
    public void setMail(String mail) {
        this.mail = mail;
    }

    /**
     * getter.
     * @return id 
     */
    @Override
    public Long getId() {
        return id;
    }

    /**
     * setter.
     * @param id 
     */
    public void setId(Long id) {
        this.id = id;
    }

    /**
     * Redéfinition du toString.
     * @return string
     */
    @Override
    public String toString() {
        return "net.etrs.formathlon.entity.utilisateur.Utilisateur[ id=" + id + " ]";
    }

    /**
     * @return the archive
     */
    @Override
    public boolean isArchive() {
        return archive;
    }

    /**
     * @param archive the archive to set
     */
    @Override
    public void setArchive(boolean archive) {
        this.archive = archive;
    }
}
